/**
 * BridgeManager 模块
 * 实现 Java/Ndk <-> JS 的统一回调路径注册与派发机制
 */
import { UserModel } from './models/user';

export class BridgeManager {
  private static _instance: BridgeManager;

  // 存储所有 JS 回调方法引用
  private callbackMap: Map<string, (data: any) => void> = new Map();

  private constructor() {}

  public static getInstance(): BridgeManager {
      if (!this._instance) {
          this._instance = new BridgeManager();
      }
      return this._instance;
  }

  /**
   * 注册一个回调函数
   * @param name 调用路径（唯一）
   * @param handler 处理函数
   */
  public registerCallback(name: string, handler: (data: any) => void) {
      this.callbackMap.set(name, handler);
      // 绑定到全局 window 方便 Java evalString("BridgeManager.invokeCallback('xxx', data)")
      (window as any).BridgeManager = this;
  }

  /**
   * 由 Java 层调用的统一入口
   * @param name 回调名
   * @param payload 参数
   */
  public invokeCallback(name: string, payload: string) {
      const callback = this.callbackMap.get(name);
      if (callback) {
          try {
              callback(payload);
          } catch (err) {
              console.error("BridgeManager callback error:", err);
          }
      } else {
          console.warn(`[BridgeManager] callback '${name}' not found.`);
      }
  }

  /**
   * 检查回调是否已注册
   * @param name 回调名称
   * @returns 是否已注册
   */
  public hasCallback(name: string): boolean {
      return this.callbackMap.has(name);
  }

  /**
   * 调用原生方法
   * @param methodName 方法名
   * @param params 参数
   */
  public callNative(methodName: string, params: string) {
      if (typeof jsb !== 'undefined') {
          try {
              if (cc.sys.os === cc.sys.OS.ANDROID) {
                  jsb.reflection.callStaticMethod(
                      "com/cocos/game/AppActivity",
                      methodName,
                      "(Ljava/lang/String;)V",
                      params
                  );
              } else if (cc.sys.os === cc.sys.OS.IOS) {
                  jsb.reflection.callStaticMethod(
                      "AppController",
                      `${methodName}:`,
                      params
                  );
              }
          } catch (error) {
              console.error(`调用原生方法失败 ${methodName}:`, error);
          }
      } else {
          console.log(`当前环境不支持jsb调用: ${methodName}`);
      }
  }
}

// BridgeManager.getInstance().registerCallback("onWXLogin", (code) => { console.log("微信code", code); });
// Java 中调用 evalString("BridgeManager.invokeCallback('onWXLogin', 'real_code')");
